#ifndef HTTP_RESPONSE_H
#define GTTP_RESPONSE_H

#include <unordered_map>
#include <unordered_set>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/mman.h>

#include "../Buffer/buffer.h"
#include "../Log/log.h"

class HttpResponse {
public:
    HttpResponse();     // 用于创建一个HttpResponse对象
    ~HttpResponse();    // 负责释放HttpResponse对象占用的资源

    // 初始化函数，设置响应的基本参数，包括静态资源目录srcDir、资源路径path、是否启用长连接isKeepAlive，以及可选的状态码code
    void Init(const std::string& srcDir, std::string& path, bool isKeepAlive = false, int code = -1);

    void MakeResponse(Buffer& buff);    // 将http响应的内容填充到给定的缓冲区(buffer)中，包括状态行、头部和正文
    void UnmapFile();       // 解除文件映射，释放与文件相关的内存资源
    char* File();           // 返回内存映射后的文件数据指针
    size_t FileLen() const; // 返回映射文件的长度
    void ErrorContent(Buffer& buff, std::string message);   // 生成错误响应内容并将其写入缓冲区(buffer)
    int Code() const {return code_;}    // 返回当前http响应的状态码

private:
    void AddStateLine_(Buffer &buff); // 向缓冲区添加HTTP响应的状态行
    void AddHeader_(Buffer &buff);    // 向缓冲区添加HTTP响应的头部
    void AddContent_(Buffer &buff);   // 向缓冲区添加HTTP响应的正文

    void ErrorHtml_();  // 用于生成HTML格式的错误页面
    std::string GetFileType_(); // 推测文件类型的辅助方法，可能基于文件扩展名

    int code_;          // 存储http响应的状态码
    bool isKeepAlive_;  // 指示http连接是否应该保持打开状态以供后续请求复用

    std::string path_;  // 存储资源的完整路径
    std::string srcDir_;// 存储静态资源根目录

    // 静态资源文件的高效传输，通过内存映射来减少I/O开销
    char* mmFile_;              // 指向通过内存映射得到的文件内容的指针
    struct stat mmFileStat_;    // 存储文件状态信息，例如大小和其他元数据

    // 三个静态常量容器，分别存储文件后缀类型对应MIME类型、HTTP状态码对应的短语说明，以及可能的编码路径映射关系。
    static const std::unordered_map<std::string, std::string> SUFFIX_TYPE;  //后缀类型集
    static const std::unordered_map<int, std::string> CODE_STATUS;          //编码状态集
    static const std::unordered_map<int, std::string> CODE_PATH;            //编码路径集
};

#endif